#include <iostream>
#include <vector>
using namespace std;

// 这道题还是动态规划，还是看不出来啊
// 就算看出来了也不会做啊

// 这道题也要区分“子串” 和 “子序列”的问题
string max_common_substr(string s1, string s2)
{
    // 找出两个字符串中较短的一个，固定下来
    // 因为题目要求输出在较短串中最先出现的那个
    if(s1.size() > s2.size())
        swap(s1, s2);

    int len1 = s1.size();
    int len2 = s2.size();

    int start = 0, max_size = 0;

    vector<vector<int>> MSC(len1 + 1, vector<int>(len2 + 1, 0));    // 多开一行一列

    for(size_t i = 1; i <= len1; i++)
    {
        for(size_t j = 1; j <= len2; j++)
        {
            if(s1[i - 1] == s2[j - 1])
                MSC[i][j] = MSC[i - 1][j - 1] + 1;
            
            if(MSC[i][j] > max_size)
            {
                max_size = MSC[i][j];
                start = i - max_size;
            }
        }
    }

    return s1.substr(start, max_size);
}

int main() {
    string s1,s2;
    cin >> s1;
    cin >> s2;
    cout << max_common_substr(s1, s2) << endl;

    return 0;
}
